package eva.savant.businessobject.mt;

import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Date;
import java.io.Serializable;

@Table(name="MT_INVENTARIO")
@IdClass(InventarioPK.class)
@javax.persistence.Entity(name = "mt.Inventario")
public class Inventario extends eva.savant.businessobject.Entity {

    @ManyToOne
    @JoinColumn(name = "ID_ALMACEN", insertable = false, updatable = false)
    private Almacen almacen; //ID Almacen

    @ManyToOne
    @JoinColumn(name = "ID_MATERIAL", insertable = false, updatable = false)
    private Material material; //ID Material

    @Basic
    @Column(name = "ACTUAL", length = 14, precision = 4, nullable = false)
    private BigDecimal actual; //Stock Actual

    @Basic
    @Column(name = "MINIMO", length = 14, precision = 4, nullable = false)
    private BigDecimal minimo; //Stock Minimo

    @Basic
    @Column(name = "MAXIMO", length = 14, precision = 4, nullable = false)
    private BigDecimal maximo; //Stock Maximo

    @Basic
    @Column(name = "ENTRADA_CANTIDAD", length = 10, nullable = true)
    private Integer entradaCantidad; //Cantidad Entrada Ultima

    @Basic
    @Column(name = "ENTRADA_COSTO", length = 14, precision = 4, nullable = true)
    private BigDecimal entradaCosto; //Cantidad Entrada Ultima

    @Basic
    @Column(name = "ENTRADA_VALOR", length = 14, precision = 4, nullable = true)
    private BigDecimal entradaValor; //Cantidad Entrada Ultima

    @Basic
    @Column(name = "SALIDA_CANTIDAD", length = 10, nullable = true)
    private Integer salidaCantidad; //Cantidad Salida Ultima

    @Basic
    @Column(name = "SALIDA_COSTO", length = 14, precision = 4, nullable = true)
    private BigDecimal salidaCosto; //Cantidad Salida Ultima

    @Basic
    @Column(name = "SALIDA_VALOR", length = 14, precision = 4, nullable = true)
    private BigDecimal salidaValor; //Cantidad Salida Ultima

    @Basic
    @Column(name = "SALDO_CANTIDAD", length = 10, nullable = false)
    private Integer saldoCantidad; //Cantidad Saldo Ultimo

    @Basic
    @Column(name = "SALDO_COSTO", length = 14, precision = 4, nullable = false)
    private BigDecimal saldoCosto; //Cantidad Saldo Ultimo

    @Basic
    @Column(name = "SALDO_VALOR", length = 14, precision = 4, nullable = false)
    private BigDecimal saldoValor; //Cantidad Saldo Ultimo

    @Basic @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "FECHA", length = 19, nullable = false)
    private Date fecha; //Fecha Ultimo

    @Basic
    @Column(name = "TIPO", length = 8, nullable = false)
    private String tipo; //Tipo Movimiento Ultimo { INGRESO EGRESO }

    @Id
    @Column(name="ID_ALMACEN")
    private String almacen_Id; //ID Almacen

    @Id
    @Column(name="ID_MATERIAL")
    private String material_Id; //ID Material


    public Inventario(Almacen almacen, Material material, BigDecimal actual, BigDecimal minimo, BigDecimal maximo, Integer entradaCantidad, BigDecimal entradaCosto, BigDecimal entradaValor, Integer salidaCantidad, BigDecimal salidaCosto, BigDecimal salidaValor, Integer saldoCantidad, BigDecimal saldoCosto, BigDecimal saldoValor, Date fecha, String tipo, Integer operacionId, String sociedadId, Integer usuarioId) {

        this.almacen= almacen;

        this.almacen_Id= almacen != null? almacen.getId() : null;

        this.material= material;

        this.material_Id= material != null? material.getId() : null;

        this.actual= actual;

        this.minimo= minimo;

        this.maximo= maximo;

        this.entradaCantidad= entradaCantidad;

        this.entradaCosto= entradaCosto;

        this.entradaValor= entradaValor;

        this.salidaCantidad= salidaCantidad;

        this.salidaCosto= salidaCosto;

        this.salidaValor= salidaValor;

        this.saldoCantidad= saldoCantidad;

        this.saldoCosto= saldoCosto;

        this.saldoValor= saldoValor;

        this.fecha= fecha;

        this.tipo= tipo;

        this.operacionId= operacionId;

        this.sociedadId= sociedadId;

        this.usuarioId= usuarioId;

    }

    public Inventario() {

    }


    public Almacen getAlmacen() {
    
        return almacen;
    }
    
    public void setAlmacen(Almacen almacen) {
    
        this.almacen = almacen;

        this.almacen_Id= almacen != null? almacen.getId() : null;
    }

    public Material getMaterial() {
    
        return material;
    }
    
    public void setMaterial(Material material) {
    
        this.material = material;

        this.material_Id= material != null? material.getId() : null;
    }

    public BigDecimal getActual() {
    
        return actual;
    }
    
    public void setActual(BigDecimal actual) {
    
        this.actual = actual;
    }

    public BigDecimal getMinimo() {
    
        return minimo;
    }
    
    public void setMinimo(BigDecimal minimo) {
    
        this.minimo = minimo;
    }

    public BigDecimal getMaximo() {
    
        return maximo;
    }
    
    public void setMaximo(BigDecimal maximo) {
    
        this.maximo = maximo;
    }

    public Integer getEntradaCantidad() {
    
        return entradaCantidad;
    }
    
    public void setEntradaCantidad(Integer entradaCantidad) {
    
        this.entradaCantidad = entradaCantidad;
    }

    public BigDecimal getEntradaCosto() {
    
        return entradaCosto;
    }
    
    public void setEntradaCosto(BigDecimal entradaCosto) {
    
        this.entradaCosto = entradaCosto;
    }

    public BigDecimal getEntradaValor() {
    
        return entradaValor;
    }
    
    public void setEntradaValor(BigDecimal entradaValor) {
    
        this.entradaValor = entradaValor;
    }

    public Integer getSalidaCantidad() {
    
        return salidaCantidad;
    }
    
    public void setSalidaCantidad(Integer salidaCantidad) {
    
        this.salidaCantidad = salidaCantidad;
    }

    public BigDecimal getSalidaCosto() {
    
        return salidaCosto;
    }
    
    public void setSalidaCosto(BigDecimal salidaCosto) {
    
        this.salidaCosto = salidaCosto;
    }

    public BigDecimal getSalidaValor() {
    
        return salidaValor;
    }
    
    public void setSalidaValor(BigDecimal salidaValor) {
    
        this.salidaValor = salidaValor;
    }

    public Integer getSaldoCantidad() {
    
        return saldoCantidad;
    }
    
    public void setSaldoCantidad(Integer saldoCantidad) {
    
        this.saldoCantidad = saldoCantidad;
    }

    public BigDecimal getSaldoCosto() {
    
        return saldoCosto;
    }
    
    public void setSaldoCosto(BigDecimal saldoCosto) {
    
        this.saldoCosto = saldoCosto;
    }

    public BigDecimal getSaldoValor() {
    
        return saldoValor;
    }
    
    public void setSaldoValor(BigDecimal saldoValor) {
    
        this.saldoValor = saldoValor;
    }

    public Date getFecha() {
    
        return fecha;
    }
    
    public void setFecha(Date fecha) {
    
        this.fecha = fecha;
    }

    public String getTipo() {
    
        return tipo;
    }
    
    public void setTipo(String tipo) {
    
        this.tipo = tipo;
    }

}

class InventarioPK implements Serializable {


    private String almacen_Id;

    private String material_Id;


    public InventarioPK(String almacen_Id, String material_Id) {

        this.almacen_Id= almacen_Id;

        this.material_Id= material_Id;

    }

    public InventarioPK() {

    }


    public String getAlmacen_Id() {
    
        return almacen_Id;
    }
    
    public void setAlmacen_Id(String almacen_Id) {
    
        this.almacen_Id = almacen_Id;
    }

    public String getMaterial_Id() {
    
        return material_Id;
    }
    
    public void setMaterial_Id(String material_Id) {
    
        this.material_Id = material_Id;
    }

    @Override
    public boolean equals(Object object) {

        if(object == null) return false;

        if(object == this) return true;

        if( !(object instanceof InventarioPK) ) return false;


        InventarioPK pk = (InventarioPK) object;


        return pk.getAlmacen_Id().equals(almacen_Id) &&

               pk.getMaterial_Id().equals(material_Id);
    }

    @Override
    public int hashCode() {

        int hashCode = 17;

        hashCode = 31 * hashCode + almacen_Id.hashCode();

        hashCode = 31 * hashCode + material_Id.hashCode();

        return hashCode;
    }

}
